//=============================================================================================
/**
 * @file	str_tool.c
 * @brief	文字列処理群
 * @author	mori
 * @date	2004.11.
 */
//=============================================================================================
#define __STR_TOOL_H_GLOBAL__


#include <nitro.h>
#include <nnsys.h>
#include "system.h"
#include "str_tool.h"

//------------------------------------------------------------------
/**
 * 文字列長を取得
 *
 * @param   str		文字列
 *
 * @retval  int		文字列長
 */
//------------------------------------------------------------------
int StrLen(char *str)
{
	int i=0;
	while(str[i]!=0){
		i++;
	}
	return i;
}

//------------------------------------------------------------------
/**
 * ある文字列str内の終端条件tokenとなる文字列までをdesにコピーする
 *
 * @param   str		文字列
 * @param   des		文字列を取り出す先のバッファ
 * @param   token	トークン
 *
 * @retval  char*   読み飛ばした先（改行のみ改行の先まで進めます）
 */
//------------------------------------------------------------------
char* StrTok(char *str, char *des, char token)
{
	int i;
	for(i=0;i<256;i++){							//暴走しないように検索範囲を限定
		des[i] = str[i];						//文字列コピー
		if(str[i]==token || str[i]==0){			//終端文字だった場合は
			des[i] = 0;							//コピー先の文字列の終端を0にして終了
			if(token==RETURN_CODE && str[i+1]==0x0a){
				return &str[i+2];				//改行コードがtokenだった場合に0x0d,0x0aの並びが入っていた場合は1文字読みとばす
			}else{
				return &str[i+1];
			}
		}
	}
	return NULL;								//終端が見つからなかった
}

//------------------------------------------------------------------
/**
 * 文字列strの中にtokenがあるかを探し、そこまでの文字数を返す
 *
 * @param   str		文字列
 * @param   token	トークン
 *
 * @retval  int
 */
//------------------------------------------------------------------
int StrTokNum(char *str,char token)
{
	int i,num=0;
	for(i=0;i<256;i++){
		if(str[i]==token){		//指定文字だった場合は＋１
			num++;
		}
		if(str[i]==0){			//0が来たら終了
			break;
		}
	}
	return num;					//見つけた回数を返す
}

//------------------------------------------------------------------
/**
 * 文字列から数値を取得（"-"にも対応)
 *
 * @param   str		文字列
 *
 * @retval  int		取得した数値
 */
//------------------------------------------------------------------
int AtoI(char *str)
{
	int w,i,keta,num;
	w = StrLen(str);

	keta = 1;
	num  = 0;
	for(i=w-1;i>=0;i--){
		if(str[i]>='0' && str[i]<='9'){
			num+=keta*(str[i]-'0');
		}else{
			if(i==0){
				if(str[i]=='-'){
					num*=-1;
				}
			}else{
				return -1;
			}
		}
		keta*=10;
	}
	return num;
}

//------------------------------------------------------------------
/**
 * 文字列コピー('0'と改行コードがきた場合に終了します)
 *
 * @param   des		コピー先
 * @param   src		コピー元
 *
 * @retval  int		コピーしたバイト数
 */
//------------------------------------------------------------------
int StrCopy(char *des, const char *src)
{
	int i=0;
	for(;;){
		des[i]=src[i];
		if(src[i]==0 || src[i]==0x0d || src[i]==0x0a){	//改行コードが入っていても0で潰す
			des[i]=0;
			break;
		}
		i++;
	}
	return i;
}

//==============================================================================
/**
 * リソース名セット
 *
 * @param   NNSG3dResName *outName
 * @oaram	const char *inName
 *
 * @retval  none
 */
//==============================================================================
void SetResName(NNSG3dResName *outName,const char *inName)
{
	u8 len;
	u8 i;

	//初期化
	for (i=0;i<4;i++){
		outName->val[i] = 0;
	}
	len = StrLen((char *)inName);
	for (i=0;i<len;i++){
		outName->name[i] = inName[i];
	}
}

//==============================================================================================
//==============================================================================================

#include "gflib\strcode.h"

//------------------------------------------------------------------
/**
 * 日本語版で入力される文字コードかチェック
 *
 * @param   code		文字コード
 *
 * @retval  BOOL		TRUEなら日本語版／FALSEだと海外版
 */
//------------------------------------------------------------------
BOOL IsJapaneseCode( STRCODE code )
{
	return (code < h_n0_);
}
